package com.ultrapower.eoms.ultrasm.util;

import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Table;

import cn.com.ultrapower.eoms.user.jdbcUtilDatabase.JdbcUtilDatabase;

import com.ultrapower.eoms.ultrasm.model.UserInfo;

/**
 * @author ： tufangquan
 * @date ： 2017-3-9 下午06:51:25
 * @Description ： TODO
 * @version
 */
@SuppressWarnings("unchecked")
public class BeanUtil{
	private static final String SOURCE = "zookeeperSYN";
	private static JdbcUtilDatabase jdbcUtilDatabase = new JdbcUtilDatabase(SOURCE);
	
	/**
	 * 查询
	 * @param sql
	 * @param cls
	 * @return list
	 * @throws SQLException 
	 */
	public static List queryToList(String sql, Class cls){
		ResultSet rss =  jdbcUtilDatabase.Query(sql);
		return getList(rss, cls);
	}
	/**
	 * 传入参数查询
	 * @param sql
	 * @param 数组
	 * @return list
	 * @throws SQLException 
	 */
	public static List queryToListArr(String sql, Object[] obj, Class cls){
		ResultSet rs =  jdbcUtilDatabase.QueryArr(sql, obj);
		return getList(rs, cls);
	}
	/**
	 * 查询
	 * @param sql
	 * @return
	 */
	public static ResultSet query(String sql){
		return jdbcUtilDatabase.Query(sql);
	}
	public static ResultSet queryArr(String sql,Object[] obj){
		return jdbcUtilDatabase.QueryArr(sql, obj);
	}
	/**
	 * 根据pid查询
	 * @param sql
	 * @param cls
	 * @return
	 */
	public static Object queryToId(String value,Class cls){
		//获取注解table表名
		String table ="";
		if (cls.isAnnotationPresent(Table.class)){
			table = ((Table) cls.getAnnotation(Table.class)).name();
			if(table==null||"".equals(table)) return null;
		}
		String sql = ModelToSQL.getQueryByIdSQL(table, "pid");
		ResultSet rss =  jdbcUtilDatabase.QueryArr(sql,new String[]{value});
		List list = getList(rss, cls);
		if(list.size()>0){
			return list.get(0);
		}else{
			return null;
		}
	}
	
	/**
	 * 新建modl
	 * @param obj
	 * @return 影响的行数
	 */
	public static int executeInsert(Object obj) {
		String sql = ModelToSQL.getInsertSQL(obj);
		int res = jdbcUtilDatabase.executeUpdate(sql);
		return res;
	}
	/**
	 * 根据pid更新model
	 * @param obj
	 * @return
	 */
	public static int executeUpdate(Object obj) {
		String sql = ModelToSQL.getUpdateSQL(obj);
		int res = jdbcUtilDatabase.executeUpdate(sql);
		return res;
	}
	/**
	 * 执行增删改(无参数)
	 * @param sql
	 * @return
	 */
	public static int execute(String sql){
		int res = jdbcUtilDatabase.executeUpdate(sql);
		return res;
	}
	
	/**
	 * 执行增删改(无参数)
	 * @param sql
	 * @return
	 */
	public static int executeArr(String sql,Object[] obj){
		int res = jdbcUtilDatabase.executeUpdateArr(sql, obj);
		return res;
	}
	
	public static List getList(ResultSet rs, Class cls) {
		// 取得Method
		Method[] methods = cls.getDeclaredMethods();
		List lst = new ArrayList();
		try {
			if(rs==null) return lst; 
			// 用于获取列数、或者列类型
			ResultSetMetaData meta = rs.getMetaData();
			Object obj = null;
			while (rs.next()) {
				// 获取formbean实例对象
				obj = cls.newInstance(); // 用Class.forName方法实例化对象和new创建实例化对象是有很大区别的，它要求JVM首先从类加载器中查找类，然后再实例化，并且能执行类中的静态方法。而new仅仅是新建一个对象实例
				// 循环获取指定行的每一列的信息
				for (int i = 1; i <= meta.getColumnCount(); i++) {
					// 当前列名
					String colName = meta.getColumnName(i);
					// 设置方法名
					String setMethodName = "set" + colName;
					// 遍历Method
					for (int j = 0; j < methods.length; j++) {
						if (methods[j].getName()
								.equalsIgnoreCase(setMethodName)) {
							setMethodName = methods[j].getName();
							//System.out.println(setMethodName);
							// 获取当前位置的值，返回Object类型
							Object value = rs.getObject(colName);
							if (value == null) {
								continue;
							}
							// 实行Set方法
							try {
								// // 利用反射获取对象
								// JavaBean内部属性和ResultSet中一致时候
								Method setMethod = obj.getClass().getMethod(
										setMethodName, value.getClass());
								setMethod.invoke(obj, value);
							} catch (Exception e) {
								// JavaBean内部属性和ResultSet中不一致时候，使用String来输入值。
							}
						}
					}
				}
				lst.add(obj);
			}
		} catch (Exception e) {
			System.out.println(e);
		}finally{
			jdbcUtilDatabase.close();
		}
		return lst;
	}
	/**
	 * 关闭
	 * @param rs
	 */
	public static void colse(ResultSet rs){
		synchronized (rs) {
			if(rs!=null){
				try {
					rs.close();
					jdbcUtilDatabase.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
//	public void run (){
//		String ii = null;
////		UserInfo ii = (UserInfo) BeanUtil.queryToId("297e39d1298150e8012981703b700002", UserInfo.class);
//		ResultSet rs = BeanUtil.query("SELECT * from BS_T_SM_USER");
//		try {
//			while(rs.next()){
//				ii = rs.getString(1);
//			}
//		} catch (SQLException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		BeanUtil.colse(rs);
//		System.out.println(ii);
//	}
//	
	public static void main(String[] args) {
		UserInfo ii = (UserInfo) BeanUtil.queryToId("297e39d1298150e8012981703b700002", UserInfo.class);
		System.out.println(ii);
	}
	
}